const http = require('http');
const express = require('express');
const fs = require('fs');
const url = require("url");
const socket = require('socket.io');
// 获取输入汉字首字母大写
const pyfl = require('pyfl').default;

// 创建一个应用
const app = express();

// 创建一个http服务
const server = http.createServer(app);

// 启动服务监听
server.listen(3000);

// 创建socket
const io = socket(server, { cors: true });

// 用户Map
const userMap = new Map();
// 在线用户名称数组(包含匿名用户)
const userNameArr = [];

// 监听连接
io.on('connection', function(mySocket) {

  // 连接成功之后发送消息
  mySocket.emit('init', { success: true });

  // 保存用户登录信息; 监听用户登录
  mySocket.on('login', function(data) {
    const { user = {} } = data;
    // 设置用户信息(只记录已登录的用户)
    if(!user.anonymous) {
      userMap.set(user.userId, user);
    }
    userNameArr.push(user.userName || '匿名用户');
    // 向所有客户端发送实时的用户信息
    io.emit('userInfo', { userNameArr });
  });

  // 修改昵称|登录
  mySocket.on('updateName', function(data) {
    const { user = {} } = data;

    const index = userNameArr.findIndex(item => item === user.oldName);
    if(index !== -1) {
      // 替换昵称
      userNameArr.splice(index, 1, user.userName);
    }

    if(userMap.has(user.userId)) {
      // 修改昵称
      const _user =  userMap.get(user.userId) || {};
      userMap.set(user.userId, { ..._user, ...user });
    }else { // 登录
      userMap.set(user.userId, user);
    }

    // 向所有客户端发送实时的用户信息
    io.emit('userInfo', { userNameArr });
  });

  // 退出
  mySocket.on('close', function(data) {
    const { user = {} } = data;
    // 普通用户退出(清除Map数据)
    if(!user.anonymous) userMap.delete(user.userId);
    // 清除在线用户名称
    const index = userNameArr.findIndex(item => item === user.userName);
    if(index !== -1) userNameArr.splice(index, 1);
    // 向所有客户端发送实时的用户信息
    io.emit('userInfo', { userNameArr });
    mySocket.disconnect(true);
  });

  // 监听客户端消息
  mySocket.on('message', function(data) {
    const { user = {} } = data;

    // 普通用户
    if(!user.anonymous) {
      const _user = userMap.get(user.userId) || {};
      // 数据处理
      const uMessage = {
        uVatarContent: pyfl(_user.userName),
        uName: _user.userName,
        uId: _user.userId,
        uMessageUUID: _user.messageUUID,
        uMessageTime: (new Date()).toLocaleString(),
        uMessageContent: user.userMessage,
      };

      // 向所有客户端发送消息(mySocket.emit则向自己发送消息)
      io.emit('message', { uMessage });
    }else {
      // 数据处理
      const uMessage = {
        uVatarContent: 'N',
        uName: '匿名用户',
        uId: user.userId,
        uMessageTime: (new Date()).toLocaleString(),
        uMessageContent: user.userMessage,
      };

      // 向所有客户端发送消息(mySocket.emit则向自己发送消息)
      io.emit('message', { uMessage });
    }
  });
});
